package algo;
/**
* Classe appliquant l'etape du tri rapide recherchant les elements a echanger
* @author Kevin Georgy
* @since 13.06.2007	
* @version 1.0
*/

public class AdvanceStep extends Step {
	
	/**
	* Construit l'etape
	* @param aQuickSort QuickSort que l'etape doit modifier
	*/	
	AdvanceStep(QuickSort aQuickSort) {
		super(aQuickSort);
	}
	
	/**
	* Applique l'etape de recherche
	* @return Etape suivante
	*/	
	Step apply() {
		super.apply();
		
		// Verifie si les curseurs se croisent
		if (quickSort.state().leftCursor <= quickSort.state().rightCursor)
		{
			
			// Les curseurs ne se croisent pas, recherche les elements a echanger
			while (quickSort.state().array.get(
				quickSort.state().leftCursor
				).compareTo(quickSort.state().reference) < 0)
			{
				quickSort.state().leftCursor++;
			}
			while (quickSort.state().array.get(
				quickSort.state().rightCursor
				).compareTo(quickSort.state().reference) > 0)
			{
				quickSort.state().rightCursor--;
			}
         
			// Definition du text explicatif
			tutoText += "Le curseur gauche d\u00E9signe "+
				quickSort.state().array.get(quickSort.state().leftCursor)+
				". Celui de droite d\u00E9signe "+
				quickSort.state().array.get(quickSort.state().rightCursor)+". ";
			
			// Verifie s'il faut echanger les elements
			if (quickSort.state().leftCursor < quickSort.state().rightCursor)
			{
				return quickSort.steps().swap();
			}
			else if (quickSort.state().leftCursor == 
				 quickSort.state().rightCursor)
			{	
				if (quickSort.state().leftCursor < 
				    quickSort.state().current.getContent().end)
					quickSort.state().leftCursor++;
				if (quickSort.state().rightCursor > 
				    quickSort.state().current.getContent().begin)
					quickSort.state().rightCursor--;
			}
			return this;
		}
		else
		{
			tutoText += "Les indices se croisent.";
			return quickSort.steps().partition();
		}

	}
	
	/**
	* Indique le nom de l'etape
	* @return Nom de l'etape
	*/	
	public String stepName() {
		return "Etape de recherche";
	}
	
}
